﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Pulsar.ItinerarioWCF;
using System.Net;
using System.IO;
using System.Web.Script.Serialization;
using Pulsar.Itinerario.Dominio;
//using Pulsar.ItinerarioWCF.Flores.ProgramacionesWS;
//using Pulsar.ItinerarioWCF.Soyuz.ProgramacionesWS;

//using Flores.ProgramacionWCF.Entidades;

namespace Pulsar.ItinerarioWCF.Persistencia
{
    public class ItinerarioDAO
    {
        //En esta clase se fusionarán todos los servicios para devolver un único registro
        public List<Pulsar.Itinerario.Dominio.Programacion> Listar(string origen, string destino, string fecini, string fecfin, string cant)
        {

            DateTime fechainicial = Convert.ToDateTime(fecini);
            DateTime fechafinal = Convert.ToDateTime(fecfin);
            int cantidad = Convert.ToInt32(cant);
            List<Pulsar.Itinerario.Dominio.Programacion> resultado = new List<Pulsar.Itinerario.Dominio.Programacion>();
            //@LAC Sección de código para llamar al servicio de Cruz del Sur
            //@LAC 2014/02/14 corregidos los cambios para que soporte parametros
            try
            {
                HttpWebRequest req = (HttpWebRequest)WebRequest
                .Create("http://localhost:2963/Programaciones.svc/Listar/" + origen + "/" + destino + "/" + fecini + "/" + fecfin + "/" + cantidad);
                req.Method = "GET";
                HttpWebResponse res = (HttpWebResponse)req.GetResponse();
                StreamReader reader = new StreamReader(res.GetResponseStream());
                string prgJson = reader.ReadToEnd();
                JavaScriptSerializer js = new JavaScriptSerializer();
                List<Pulsar.Itinerario.Dominio.Programacion> prgLst = js.Deserialize<List<Pulsar.Itinerario.Dominio.Programacion>>(prgJson);

                foreach (Pulsar.Itinerario.Dominio.Programacion item in prgLst)
                {
                    Pulsar.Itinerario.Dominio.Programacion p = new Pulsar.Itinerario.Dominio.Programacion();
                    p.idProgramacion = item.idProgramacion;
                    p.ruc = item.ruc;
                    p.razSocial = item.razSocial;
                    p.fecha = item.fecha;
                    p.origen = item.origen;
                    p.destino = item.destino;
                    p.asientos = item.asientos;
                    p.stock = item.stock;
                    p.precio = Convert.ToDecimal(item.precio);
                    resultado.Add(p);
                }
            }
            catch (Exception)
            {

            }

            //@LAC Sección de código para llamar al servicio de Flores SOAP
            //@LAC 2014/02/15 agregado a la lista
            try
            {


                //Pulsar.ItinerarioWCF.Flores.ProgramacionesWS;
                Pulsar.ItinerarioWCF.Flores.ProgramacionesWS.Programacion[] itinerariosAListar;

                //1. Inicializar el objeto de prueba
                Flores.ProgramacionesWS.ProgramacionClient proxy = new Flores.ProgramacionesWS.ProgramacionClient();
                //2. Invocar la operacion del objeto de prueba
                itinerariosAListar = proxy.ConsultarDestinos(origen, destino, fechainicial, fechafinal, cantidad);
                //3. Validar los valores esperados
                foreach (var item in itinerariosAListar)
                {
                    Pulsar.Itinerario.Dominio.Programacion pf = new Pulsar.Itinerario.Dominio.Programacion();
                    pf.idProgramacion = item.idProgramacion;
                    pf.ruc = item.Ruc;
                    pf.razSocial = item.RazSocial;
                    pf.fecha = item.Fecha;
                    pf.origen = item.Origen;
                    pf.destino = item.Destino;
                    pf.asientos = item.Asientos;
                    pf.stock = item.Stock;
                    pf.precio = item.Precio;

                    resultado.Add(pf);
                }
            }
            catch (Exception)
            {

            }


            //@LAC Sección de código para llamar al servicio de Soyuz
            try
            {
                /*
                //Pulsar.ItinerarioWCF.Soyuz.ProgramacionesWS.Programacion[] itinerariosAListar;

                //1. Inicializar el objeto de prueba
                Soyuz.ProgramacionesWS.PropuestasSYZClient soyuz = new Soyuz.ProgramacionesWS.PropuestasSYZClient();
                //2. Invocar la operacion del objeto de prueba
                itinerariosAListar = soyuz.ConsultarProgramaciones(fechainicial, fechafinal, origen, destino, cantidad);
                //3. Validar los valores esperados
                foreach (var item in itinerariosAListar)
                {
                    Pulsar.Itinerario.Dominio.Programacion ps = new Pulsar.Itinerario.Dominio.Programacion();
                    ps.idProgramacion = item.Id_programacion;
                    ps.ruc = item.Ruc;
                    ps.razSocial = item.Raz_social;
                    ps.fecha = item.Fecha;
                    ps.origen = item.Origen;
                    ps.destino = item.Destino;
                    ps.asientos = item.Asientos;
                    ps.stock = item.Stock;
                    ps.precio = item.Precio;

                    resultado.Add(ps);
                }


                Soyuz.ProgramacionesWS.PropuestasSYZClient soyuz = new Soyuz.ProgramacionesWS.PropuestasSYZClient();
                foreach (var item in soyuz.ConsultarProgramaciones(fechainicial, fechafinal, origen, destino, cantidad))

                {
                    Pulsar.Itinerario.Dominio.Programacion ps = new Pulsar.Itinerario.Dominio.Programacion();
                    ps.idProgramacion = item.Id_programacion;
                    ps.ruc = item.Ruc;
                    ps.razSocial = item.Raz_social;
                    ps.fecha = item.Fecha;
                    ps.origen = item.Origen;
                    ps.destino = item.Destino;
                    ps.asientos = item.Asientos;
                    ps.stock = item.Stock;
                    ps.precio = item.Precio;

                    resultado.Add(ps);
                }
                 */
            }
            catch (Exception)
            {
            }


            //@LAC retorno del resultado
            return resultado;
        }

        //@LAC Aggregado para registrar reservas 
        public String Registrar(string idProgramacion, string dni, string cantidad)
        {
            try
            {
                String seleccion = idProgramacion.Substring(0, 1);
                String res = "";
                switch (seleccion)
                {
                    case "C": //llamar metodo de Cruz del Sur
                        res= RegistrarCruzDelSur(idProgramacion, dni, cantidad);
                        break;
                    case "S": //llamar metodo de Soyuz
                        res= "SI";
                        break;
                    case "F": //llamar metodo de flores
                        res= RegistrarFlores(idProgramacion,dni,cantidad);
                        break;

                }
                return res;
            }
            catch (Exception)
            {
                return "NO";
            }


        }

        private string RegistrarFlores(string idProgramacion, string dni, string cantidad)
        {

            try
            {
                //FloresSRV.ProgramacionClient prg = new FloresSRV.ProgramacionClient();
                //return prg.ActualizarProgramacion(idProgramacion, dni, Convert.ToInt32(cantidad));
                return "NO";
            }
            catch (Exception)
            {
                //@LAC: aqui va mensajeria, se dispara cuando no se pudo insertar o modificar el stock

                return "NO";
            }
        }

        private string RegistrarCruzDelSur(string idProgramacion, string dni, string cantidad)
        {
            try
            {
                //@lac
            HttpWebRequest req = (HttpWebRequest)WebRequest
            .Create("http://localhost:2963/Programaciones.svc/Registrar/" + idProgramacion + "/" + dni + "/" + cantidad);
            req.Method = "GET";
            HttpWebResponse res = (HttpWebResponse)req.GetResponse();
            StreamReader reader = new StreamReader(res.GetResponseStream());
            string prgJson = reader.ReadToEnd();
            JavaScriptSerializer js = new JavaScriptSerializer();
            string resultado = js.Deserialize<string>(prgJson);
            if (resultado.Equals("NO"))
            {
                //registrar mensajeria
            }
            return resultado;
            }
            catch (Exception)
            {
                return "NO";
            }
        }
    }
}